// LennardJones.cpp: archivo de proyecto principal.

#include <complex>
#include <fstream>
#include <iostream>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<time.h>


using namespace std;


#define kB 8.314e-03
#define pi 3.1415926535898
#define avogadro 602.205

template<typename T>inline T SQR(T x)
	{  return(x*x);  }
template<typename T>inline T POW3(T x)
	{  return(x*x*x);  }

template<typename T>inline T VLENGTH3(const T *x)
	{  return(sqrt(SQR(x[0])+SQR(x[1])+SQR(x[2])));  }


#include "utils.h"
#include "particulas.h"
#include "caja.h"
#include "values.h"


int main(void)
{
	//double Temp=0.1;
	double Temp=3.0;
	double delta=0.1;
	int npart=125;
	double phi=0.262;
	double rcut=2.5;
	double Etotal;
	double porcentaje;

	///Reanudar simulacion anterior
	bool restart = false;
	//Impresion de valores energia/presion/temperatura en pantalla
	bool printScreen = false;
	///Caja de la simulacion
	caja *box;

	char name[50];
	sprintf (name, "%s","H:\\config.xyz");
	ofstream finput (name,ios::out);
	//finput<<""<<endl;
	finput.close();
	sprintf (name, "%s","resultados.txt");
	ofstream finp (name,ios::out);
	finp.close();

	sprintf(name,"%s","H:\\config");

	///Comenzamos una simulacion desde el principio?
	if(!restart)
	{
		box = new caja(npart, Temp, phi, rcut, delta);
	}
	else
	{
		box = new caja("inicio.txt", delta);
	}

	box->printXYZfile(name, 0);
	//box->listaVecinos();
	box->linkCell();
	box->calcEnergia();

	for (int i=0;i<10000000;i++)
	{
		box->testLinkCell();
		box->nacc=i;
		box->randomMovement();

		if(i%npart*100==0)
		{
			cout<<"Salvando paso "<<i<<endl;
			porcentaje = box->nok/box->ntry;
			/*if(porcentaje<0.4)
			{
				delta*=0.99;
			}
			if(porcentaje>0.8)
			{
				delta+=1.01;
			}*/
			cout<<"Porcentaje de aceptacion: "<<100.0*porcentaje<<" % (delta: "<<delta<<")"<<endl;
			box->calcEnergia();
			cout<<"Etotal: "<<box->epoten<<endl;
		//	//box->printConfig();
			values(box, i,printScreen);
			box->printXYZfile(name, i);
		}
	}

	delete box;
	cout<<"sacabo"<<endl;
	system("PAUSE");
	return EXIT_SUCCESS;
}
